package com.li.manage.aspect;

import java.lang.reflect.Method;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.beans.factory.annotation.Autowired;

import com.li.manage.service.UserService;

@Aspect
public class LogAspect {

	@Autowired
	private UserService userService;
	
	@Pointcut("execution(* com.li.manage.service.*.insert(..)) ||execution(* com.li.manage.service.*.add(..))")
	public void insertAspect(){}
	
	@Pointcut("execution(* com.li.manage.service.*.update(..))")
	public void updateAspect(){}
	
	@Pointcut("execution(* com.li.manage.service.*.delete(..))")
	public void deleteAspect(){}
	
	@AfterReturning(value="insertAspect()",argNames="",returning="")
	public void insertAspectCall(JoinPoint joinPoint) throws Exception{
		//判断参数  
        if(joinPoint.getArgs() == null){//没有参数  
            return;  
        }  
        //获取方法名  
        String methodName = joinPoint.getSignature().getName();  
          
        //获取操作内容  
        String opContent = adminOptionContent(joinPoint.getArgs(), methodName);
	}
	/** 
     * 使用Java反射来获取被拦截方法(insert、update)的参数值， 
     * 将参数值拼接为操作内容 
     */  
    public String adminOptionContent(Object[] args, String mName) throws Exception{  
        if (args == null) {  
            return null;  
        }
          
        StringBuffer rs = new StringBuffer();  
        rs.append(mName);  
        String className = null;  
        int index = 1;  
        // 遍历参数对象  
        for (Object info : args) {  
            //获取对象类型  
            className = info.getClass().getName();  
            className = className.substring(className.lastIndexOf(".") + 1);  
            rs.append("[参数" + index + "，类型：" + className + "，值：");  
              
            // 获取对象的所有方法  
            Method[] methods = info.getClass().getDeclaredMethods();  
            // 遍历方法，判断get方法  
            for (Method method : methods) {  
                String methodName = method.getName();  
                // 判断是不是get方法  
                if (methodName.indexOf("get") == -1) {// 不是get方法  
                    continue;// 不处理  
                }
                  
                Object rsValue = null;  
                try {  
                    // 调用get方法，获取返回值  
                    rsValue = method.invoke(info);  
                      
                    if (rsValue == null) {//没有返回值  
                        continue;  
                    }  
                      
                } catch (Exception e) {  
                    continue;  
                }  
                //将值加入内容中  
                rs.append("(" + methodName + " : " + rsValue + ")");  
            }  
            rs.append("]");  
            index++;  
        }  
        return rs.toString();  
    }
	
}
